#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>

typedef void (*func_t)();
#define NUM 5
func_t handlers[NUM];

void DownLoad()
{
  printf("download_task\n");
}
void Flush()
{
  printf("flush_task\n");
}
void Log()
{
  printf("log_task\n");
}

void registerHandler(func_t h[],func_t f)
{
  int i = 0;
  for(;i<NUM;i++)
  {
    if(h[i] == NULL) break;
  }
  if(i == NUM) return;
  h[i] = f;
  h[i + 1] = NULL;
}
int main()
{
  registerHandler(handlers,DownLoad);
  registerHandler(handlers,Flush);
  registerHandler(handlers,Log);

  pid_t id = fork();
  if(id == 0)
  {
    int cnt = 3;
    while(1)
    {
      sleep(3);
      printf("i am childprocess,pid:%d,ppid:%d\n",getpid(),getppid());
      sleep(1);
      cnt--;
    }
    exit(10);
  }

  while(1)
  {
    int status = 0;
    pid_t rid = waitpid(id,&status,WNOHANG);
    if(rid > 0)
    {
      printf("wait success,rid:%d,exit code:%d,exit signal:%d\n",rid,(status>>8)&0xFF,status&0x7F);
      break;
    }
    else if(rid == 0)
    {
      int i = 0;
      for(;handlers[i];i++)
      {
        handlers[i]();
      }
      printf("complete!\n");
      sleep(1);
    }
    else 
    {
      printf("wait fail!\n");
      break;
    }
  }
  return 0;
}







//int main()
//{
//  pid_t id = fork();
//  //pid_t rid = wait(NULL);
//  int status = 0;
//  pid_t rid = waitpid(id,&status,0);
//  if(rid > 0)
//  {
//    if(WIFEXITED(status))
//    {
//      printf("wait success,rid:%d,exit code:%d,exit signal:%d\n",rid,WEXITSTATUS(status),status&0x7F);
//    }
//    else 
//    {
//      printf("子进程推出异常\n");
//    }
//    //printf("wait success,rid:%d,exit code:%d,exit signal:%d\n",rid,(status>>8)&0xFF,status&0x7F);
//  }
//  else 
//  {
//    printf("wait failed:%d:%s\n",errno,strerror(errno));
//  }
//  return 0;
//}
//
//




//int main()
//{
  //printf("main!");

  //sleep(2);
  //_exit(23);

 //for(int i = 0;i<200;i++)
  //{
   // printf("%d->%s\n",i,strerror(i));
  //}
  //exit(10);
  
  //return 0;
//}




//extern char **environ;
//int main(int argc,char *argv[],char *env[])
//{
//  (void)argc;
//  (void)argv;
//  (void)env;
//  if(fork() == 0)
//  {
//    for(int i = 0;environ[i];i++)
//    {
//      printf("environ[%d]->%s\n",i,environ[i]);
//    }
//  }
//  sleep(3);
//  return 0;
//}
//



//int main()
//{
//  const char *who = getenv("USER");
//  if(who == NULL) return 1;
//
//  if(strcmp(who,"szy")==0)
//  {
//    printf("这是程序的正常执行逻辑\n");
//  }
//  else 
//  {
//    printf("Only szy!\n");
//  }
//}
//





//int main(int argc,char *argv[],char *env[])
//{
//  for(int i = 0;env[i];i++)
//  {
//    printf("env[%d]->%s\n",i,env[i]);
//  }
//  return 0;
//}
//





//int main()
//{
//  char *value = getenv("PATH");
//  if(value == NULL)
//    return 1;
//  printf("PATH->%s\n",value);
//  return 0;
//}
//




//#include <stdio.h>
//#include <string.h>
//int main(int argc,char *argv[])
//{
//  if(argc != 2)
//  {
//    printf("Usage:%s [-a|-b|-c]\n",argv[0]);
//    return 1;
//  }
//  char *arg = argv[1];
//  if(strcmp(arg,"-a") == 0)
//  {
//    printf("指令a\n");
//  }
//  else if(strcmp(arg,"-b") == 0)
//  {
//    printf("指令b\n");
//  }
//  else 
//  {
//    printf("其他指令\n");
//  }
//  
//  return 0;
//}
